using System;
using System.Collections;

////////////////////////////////////////////////////////////////////////////////////////////////////
// namespace: Dimok
//
// summary:	.
////////////////////////////////////////////////////////////////////////////////////////////////////

namespace Dimok{

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <summary>	Array list ex. </summary>
	///
	/// <remarks>	Dimon, 11/23/2010. </remarks>
	////////////////////////////////////////////////////////////////////////////////////////////////////

	public class ArrayListEx : ArrayList{

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Default constructor. </summary>
		///
		/// <remarks>	Dimon, 11/22/2010. </remarks>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public ArrayListEx():base(){}

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Constructor. </summary>
		///
		/// <remarks>	Dimon, 11/22/2010. </remarks>
		///
		/// <param name="values">	The values. </param>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public ArrayListEx(string values):base(new StringList(values)){}

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Constructor. </summary>
		///
		/// <remarks>	Dimon, 11/22/2010. </remarks>
		///
		/// <param name="collection">	The collection. </param>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public ArrayListEx(ICollection collection):base(collection){}

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	string[] casting operator. </summary>
		///
		/// <remarks>	Dimon, 11/22/2010. </remarks>
		///
		/// <param name="a">	a. </param>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public static implicit operator string[](ArrayListEx a){return new StringList(a.ToArray());}

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	string casting operator. </summary>
		///
		/// <remarks>	Dimon, 11/22/2010. </remarks>
		///
		/// <param name="a">	a. </param>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public static implicit operator string(ArrayListEx a){return new StringList(a.ToArray()).Join();}

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	int[] casting operator. </summary>
		///
		/// <remarks>	Dimon, 11/22/2010. </remarks>
		///
		/// <param name="a">	a. </param>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public static implicit operator int[](ArrayListEx a){return (int[])a.ToArray(typeof(int));}

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	byte[][] casting operator. </summary>
		///
		/// <remarks>	Dimon, 11/22/2010. </remarks>
		///
		/// <param name="a">	a. </param>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public static implicit operator byte[][](ArrayListEx a){return (byte[][])a.ToArray(typeof(byte[]));}

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Joins. </summary>
		///
		/// <remarks>	Dimon, 11/22/2010. </remarks>
		///
		/// <param name="separeator">	The separeator. </param>
		///
		/// <returns>	. </returns>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public string Join(string separeator){return string.Join(separeator,this);}
	}
}
